
#ifndef _BOSS_H_
#define _BOSS_H_

#include "Heros.h"


/** @brief File brief description
 Le fichier Boss.h contient la declaration de toutes les fonctions et procedures necessaires
 au plus puissant ennemi qu'il existe sur un niveau:le boss.Il y a un boss different par niveau
 representant l'ultime challenge du niveau pour le heros*/


typedef enum {boss1, boss2, boss3} TypeBoss;


/** @brief Un boss possede un type, de la vie, une position donnee par 2 reels,une taille suivant
 * les deux axes X et Y (2 reels) et une trajectoire) ainsi qu'un entier timer_traj*/
typedef struct 
{
	TypeBoss type_ennemi_boss;
	int PV_boss;
	float posX_boss;
	float posY_boss;
	float tailleX_boss;
	float tailleY_boss;
	Trajectoire* ptraj_boss;
	int timer_traj;
	int direction;
} Boss;


/** @brief Cette procedure initialise un Boss en saisissant toutes ses caracteristiques
 * @param [in,out] pboss
 * @param [in] type_boss
 * @param [in] PV
 * @param [in] posX
 * @param [in] posY
 * @param [in] tailleX
 * @param [in] tailleY
 * @param [in,out] ptraj
 * @param [in] direction
 */
void initBoss (Boss* pboss, const TypeBoss type_boss, const float posX, const float posY, Trajectoire* ptraj, int direction);


/** @brief Cette fonction reserve dans le tas l'espace necessaire pour un boss,
 * l'initialise et retourne un pointeur sur le boss cree
 * @param [in] type_boss
 * @param [in] PV
 * @param [in] posX
 * @param [in] posY
 * @param [in] tailleX
 * @param [in] tailleY
 * @param [in,out] ptraj
 * @param [in] direction
 * @return Boss* pboss
 */
Boss* creerBoss (const TypeBoss type_boss, const float posX, const float posY, Trajectoire* ptraj, int direction);


/** @brief Cette procedure libere l'espace memoire alloue dans le tas pour la trajectoire d'un boss
 *  @param [in,out] pboss*/
void libereBoss (Boss* pboss);


/** @brief Cette procedure libere l'espace alloue dans le tas pour un boss
 *  @param [in,out] ppboss
 */
void detruireBoss (Boss** ppboss);


/** @brief Cette fonction retourne un entier correspondant au type du boss passe en parametre
 * @param [in] pboss
 * @return pboss->type_ennemi_boss
 */
TypeBoss getTypeEnnemiBoss (const Boss* pboss);


/** @brief Cette procedure permet de changer le type du boss passe en parametre,
 * en fournissant une nouvelle valeur en donnee
 * @param [in,out] pboss
 * @param [in] type_boss
 */
void setTypeEnnemiBoss (Boss* pboss, const TypeBoss type_boss);


/** @brief Cette fonction retourne un entier correspondant aux PV du boss
 * @param [in] pboss
 * @return pboss->PV_boss
 */
const int getPVBoss (const Boss* pboss);


/** @brief Cette procedure permet de changer les PV du boss passe en parametre,
 * en fournissant une nouvelle valeur en donnee
 * @param [in,out] pboss
 * @param [in] PV
 */
void setPVBoss (Boss* pboss, const int PV);


/** @brief Cette fonction retourne un reel correspondant a la position en x du boss
 * @param [in] pboss
 * @return pboss->posX_boss
 */
const float getPosXBoss (const Boss* pboss);


/** @brief Cette procedure permet de changer la position en x du boss passe en parametre,
 * en fournissant une nouvelle valeur en donnee
 * @param [in,out] pboss
 * @param [in] posX
 */
void setPosXBoss (Boss* pboss, const float posX);


/** @brief Cette fonction retourne un reel correspondant a la position en y du boss
 * @param [in] pboss
 * @return pboss->posY_boss
 */
const float getPosYBoss (const Boss* pboss);


/** @brief Cette procedure permet de changer la position en y du boss passe en parametre,
 * en fournissant une nouvelle valeur en donnee
 * @param [in,out] pboss
 * @param [in] posY
 */
void setPosYBoss (Boss* pboss, const float posY);


/** @brief Cette fonction retourne un reel correspondant a la taille en x du boss
 * @param [in] pboss
 * @return pboss->tailleX_boss
 */
const float getTailleXBoss (const Boss* pboss);


/** @brief Cette procedure permet de changer la taille en x du boss passe en parametre,
 * en fournissant une nouvelle valeur en donnee
 * @param [in,out] pboss
 * @param [in] tailleX
 */
void setTailleXBoss (Boss* pboss, const float tailleX);


/** @brief Cette fonction retourne un reel correspondant a la taille en y du boss
 * @param [in] pboss
 * @return pboss->tailleY_boss
 */
const float getTailleYBoss (const Boss* pboss);


/** @brief Cette procedure permet de changer la taille en y du boss passe en parametre,
 * en fournissant une nouvelle valeur en donee
 * @param [in,out] pboss
 * @param [in] tailleY
 */
void setTailleYBoss (Boss* pboss, const float tailleY);


/** @brief Cette fonction retourne un entier correspondant au timer utilise pour changer
 * de trajectoire
 * @param [in] pboss
 * @return pboss->timer_traj
 */
const int getTimerTrajBoss (const Boss* pboss);


/** @brief Cette procedure permet de changer le timer utiliser pour changer de trajectoire,
 * en fournissant une nouvelle valeur en donnee
 * @param [in,out] pboss
 * @param [in] timertraj
 */
void setTimerTrajBoss (Boss* pboss, const int timertraj);


/** @brief Cette procedure permet de changer les positions x et y du boss d'un cran,
 * en fonction de sa trajectoire
 * @param [in,out] pboss
 * @param [in] pterrain
 */
void deplacerBoss (Boss* pboss, Terrain* pterrain);


/** @brief Cette fonction retourne un tir initialise a la position du boss, dont la trajectoire
 * est dirigee vers le heros
 * @param [in] pboss
 * @param [in] pterrain
 * @param [in] pheros
 * @return ptir
 */
Tir* tirerBoss (Boss* pboss, Terrain* pterrain, Heros* pheros);


/** @brief Cette procedure permet de retirer au boss de la vie
 * @param [in,out] pboss
 * @param [in] degat
 */
void enleverVieBoss (Boss* pboss, const int degat);

/** @brief Cette fonction permet de s'assurer que le boss est dans la fenêtre de vue.
 * @param [in] pterrain
 * @param [in] pboss
 * @param [in] deplacementX
 * @param [in] deplacementY
 */
const int terEstPositionBossValide (const Terrain* pterrain,Boss* pboss, const float deplacementX,
	     const float deplacementY);
	     
#endif







